#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
unordered_map<int,int>p[100005];
vector<int>ep[100005];
int dep[100005];
int n,q;
int a[100005];
int fa[100005];
int s[100005];
void dfs(int k,int sum){
dep[k]=dep[fa[k]]+1;
sum+=a[k]*a[k];
s[k]=sum;
for(int i=0;i<ep[k].size();i++){
dfs(ep[k][i],sum);
}
}
int f(int x,int y){
if(x>y)swap(x,y);
if(x==y)return s[x];
if(dep[x]%3==0){
int op=p[x][y];
if(op)return op;
return p[x][y]=f(fa[x],fa[y])+a[x]*a[y];
}
return f(fa[x],fa[y])+a[x]*a[y];
}
void solve(){
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int t1,t2;
for(int i=2;i<=n;i++){
scanf("%lld",&fa[i]);
ep[fa[i]].push_back(i);
}
dfs(1,0);
for(int i=1;i<=q;i++){
scanf("%lld %lld",&t1,&t2);
printf("%lld\n",f(t1,t2));
}
}
signed main(){
T=1;
//ios::sync_with_stdio(0);
//cin.tie(0);
//cin>>T;
while(T--){
solve();
}
return 0;
}
1051. Height Checker | 695. Max Area of Island |
402. Remove K Digits | 97. Interleaving String |
543. Diameter of Binary Tree | 124. Binary Tree Maximum Path Sum |
1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts | 501A - Contest |
160A- Twins | 752. Open the Lock |
1535A - Fair Playoff | 1538F - Interesting Function |
1920. Build Array from Permutation | 494. Target Sum |
797. All Paths From Source to Target | 1547B - Alphabetical Strings |
1550A - Find The Array | 118B - Present from Lena |
27A - Next Test | 785. Is Graph Bipartite |
90. Subsets II | 1560A - Dislike of Threes |
36. Valid Sudoku | 557. Reverse Words in a String III |
566. Reshape the Matrix | 167. Two Sum II - Input array is sorted |
387. First Unique Character in a String | 383. Ransom Note |
242. Valid Anagram | 141. Linked List Cycle |